;汇编环境：Visual Studio Community 2019 版本 16.9.3
;配置方法：（1） 新建“Win32控制台项目”——>“空项目”，在解决方案资源管理器中，
;			右键选择“生成依赖项”——>“生成自定义”，勾选 masn
;		   （2 ） 在项目“属性”——>"链接器"——>“高级”中，填写入口点
;			本代码的入口点为 main
.586
.model flat,stdcall
option casemap:none

includelib ucrt.lib
includelib legacy_stdio_definitions.lib
includelib User32.lib
includelib Kernel32.lib

ExitProcess PROTO uType:DWORD
extern printf:proc
extern putchar:proc
extern scanf:proc

.data
num1		dd ?		;第一个整数	
num2		dd ?		;第二个整数	
op			db ?		;运算符
result		dd ?		;运算结果
remainder	dd ?		;除法余数
inputMessage	db '%d %c %d', 0
outputMessage	db '%d %c %d = %d', 0ah, 0
outputDivMessage db '%d / %d = %d ... %d', 0ah, 0

.code
main proc
	; scanf("%d %c %d", &num1, &op, &num2);	
	lea eax, num2
	push eax
	lea eax, op
	push eax
	lea eax, num1
	push eax
	lea eax, inputMessage
	push eax
	call scanf
	add esp, 10h		; __cdecl

	; 判断运算符
	cmp op, '+' 
	jz add_proc
	cmp op, '-'
	jz sub_proc
	cmp op, '*'
	jz mul_proc
	cmp op, '/'
	jz div_proc
	jmp output_proc
	; 加法过程
add_proc:
	mov eax, num1
	add eax, num2
	mov result, eax
	jmp output_proc
	; 减法过程
sub_proc:
	mov eax, num1
	sub eax, num2
	mov result, eax
	jmp output_proc
	; 乘法过程
mul_proc:
	mov eax, num1
	imul eax, num2
	mov result, eax
	jmp output_proc
	; 除法过程 (edx:eax) / num2 = eax ... edx
div_proc:
	mov edx, 0
	mov eax, num1
	mov ebx, num2
	idiv ebx
	mov result, eax 
	mov remainder, edx
	; 输出 + - * 的结果
output_proc:
	cmp	op, '/'
	jz output_div_proc
	; printf("%d %c %d = %d", num1, op, num2, result);
	push result
	push num2
	push dword ptr op
	push num1
	push offset outputMessage
	call printf
	add esp, 14h		;__cdecl

	jmp main
	; 输出 num1 / num2 的结果
output_div_proc:
	; printf("%d / %d = %d ... %d", num1, num2, result, remainder);
	push remainder
	push result
	push num2
	push num1
	push offset outputDivMessage
	call printf
	add esp, 14h
	
	jmp main
exit_program:
	;ExitProcess
	push 0
	call ExitProcess
main endp
end